package com.t2tierp.pafecf.controller;

import br.com.modelo.PreVendaCabecalho;
import br.com.modelo.PreVendaDetalhe;
import br.com.util.JPAUtil;
import com.t2tierp.pafecf.infra.Ecf;
import com.t2tierp.pafecf.view.Caixa;
import java.text.SimpleDateFormat;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;

public class PreVendaController {

    public List<PreVendaDetalhe> carregaPreVenda(Integer pId) {
        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        Query q = em.createNamedQuery("FROM PreVendaDetalhe c WHERE c.id = ?");
        q.setParameter(1, pId);
        List<PreVendaDetalhe> retorno = q.getResultList();
        em.close();
        return retorno;
    }

    public void fechaPreVenda(Integer pId, Integer pCCF) {
        PreVendaCabecalho prevenda = JPAUtil.buscarPorId(PreVendaCabecalho.class, pId);
        prevenda.setSituacao('E');
        prevenda.setCcf(pCCF);
        JPAUtil.mergeObjeto(prevenda);
    }

    //TODO : O que está faltando para completar essa rotina mesclaPreVenda?
//    public Integer mesclaPreVenda(List<PreVendaCabecalhoVO> pListaPreVendaCabecalho) {
//        //inicia e configura a nova Pre-Venda
//
//        PreVendaCabecalhoVO novaPreVenda = new PreVendaCabecalhoVO();
//        Calendar hoje = Calendar.getInstance();
//        novaPreVenda.setDataEmissao(hoje.getTime());
//        novaPreVenda.setHoraEmissao(hoje.get(Calendar.HOUR_OF_DAY) + ":" + hoje.get(Calendar.MINUTE) + ":" + hoje.get(Calendar.SECOND));
//        novaPreVenda.setSituacao("P");
//
//        BigDecimal totalPreVenda = BigDecimal.ZERO;
//        //atualiza a tabela de cabecalho
//        Integer idCliente = null;
//        for (int i = 0; i < pListaPreVendaCabecalho.size(); i++) {
//            totalPreVenda = totalPreVenda.add(BigDecimal.valueOf(pListaPreVendaCabecalho.get(i).getValor()));
//            idCliente = pListaPreVendaCabecalho.get(i).getCliente().getId();
//            totalPreVenda.setScale(Caixa.configuracao.getDecimaisValor(), RoundingMode.DOWN);
//
//            //altera a situacao da PV selecionada para M de mesclada
//            consultaSQL =
//                    "update ecf_pre_venda_cabecalho set "
//                    + "SITUACAO=? "
//                    + " where ID = ?";
//
//            try {
//                pstm = bd.conectarServer(Caixa.configuracao.getIpServidor()).prepareStatement(consultaSQL);
//                pstm.setString(1, "M");
//                pstm.setInt(2, pListaPreVendaCabecalho.get(i).getId());
//                pstm.executeUpdate();
//
//            } catch (Exception e) {
//                e.printStackTrace();
//            } finally {
//                bd.desconectar();
//            }
//        }
//        novaPreVenda.setValor(totalPreVenda.doubleValue());
//
//        //cria uma nova PV
//        consultaSQL =
//                "insert into ecf_pre_venda_cabecalho ("
//                + "DATA_PV, "
//                + "HORA_PV, "
//                + "SITUACAO, "
//                + "VALOR, "
//                + "ID_CLIENTE) values ("
//                + "?,?,?,?,?)";
//
//        try {
//            pstm = bd.conectarServer(Caixa.configuracao.getIpServidor()).prepareStatement(consultaSQL);
//            pstm.setDate(1, new java.sql.Date(novaPreVenda.getDataEmissao().getTime()));
//            pstm.setString(2, novaPreVenda.getHoraEmissao());
//            pstm.setString(3, novaPreVenda.getSituacao());
//            pstm.setDouble(4, novaPreVenda.getValor());
//            pstm.setInt(5, idCliente);
//            pstm.executeUpdate();
//
//            try {
//                stm = bd.conectarServer(Caixa.configuracao.getIpServidor()).createStatement();
//                rs = stm.executeQuery("select max(ID) as ID from ecf_pre_venda_cabecalho");
//                rs.first();
//                novaPreVenda.setId(rs.getInt("ID"));
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            bd.desconectar();
//        }
//
//        try {
//            //atualiza a tabela de detalhes
//            List<PreVendaDetalheVO> listaPreVendaDetalhe = new ArrayList<PreVendaDetalheVO>();
//            String insiraDetalhe =
//                    "insert into ecf_pre_venda_detalhe ("
//                    + "ID_PRODUTO,"
//                    + "ID_ECF_PRE_VENDA_CABECALHO,"
//                    + "QUANTIDADE,"
//                    + "VALOR_UNITARIO,"
//                    + "VALOR_TOTAL) values ("
//                    + "?,?,?,?,?)";
//            for (int j = 0; j < pListaPreVendaCabecalho.size(); j++) {
//                if (pListaPreVendaCabecalho.get(j).getSelecao() != null) {
//                    listaPreVendaDetalhe = listaPreVendaDetalhePendente(pListaPreVendaCabecalho.get(j).getId());
//                    if (listaPreVendaDetalhe != null) {
//                        for (int i = 0; i < listaPreVendaDetalhe.size(); i++) {
//                            pstm = bd.conectarServer(Caixa.configuracao.getIpServidor()).prepareStatement(insiraDetalhe);
//                            pstm.setInt(1, listaPreVendaDetalhe.get(i).getIdProduto());
//                            pstm.setInt(2, novaPreVenda.getId());
//                            pstm.setDouble(3, listaPreVendaDetalhe.get(i).getQuantidade());
//                            pstm.setDouble(4, listaPreVendaDetalhe.get(i).getValorUnitario());
//                            pstm.setDouble(5, listaPreVendaDetalhe.get(i).getValorTotal());
//                            pstm.executeUpdate();
//                        }
//                    }
//                }
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            bd.desconectar();
//        }
//        return novaPreVenda.getId();
//    }
    public List<PreVendaCabecalho> cancelaPreVendasPendentes() {
        //verifica se existem PV pendentes
        try {
            SimpleDateFormat formatoData = new SimpleDateFormat("yyyy-MM-dd");
            String dataEcf = formatoData.format(Ecf.getDataHoraEcf());
            EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
            Query q = em.createQuery("FROM PreVendaCabecalho p WHERE p.situacao = 'P' AND p.dataPv < '" + dataEcf + "'");
            List<PreVendaCabecalho> listapreVendas = q.getResultList();

            //atualizando situacao no banco de dados
            for (PreVendaCabecalho v : listapreVendas) {
                v.setSituacao('C');
                JPAUtil.mergeObjeto(v);
            }
            em.close();
            return listapreVendas;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public void cancelaPreVendas(List<PreVendaCabecalho> listaPreVendas) {
        //TODO : É necessário imprimir os itens da pre-venda?
        try {
            for (PreVendaCabecalho v : listaPreVendas) {
                v.setSituacao('C');
                JPAUtil.mergeObjeto(v);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public List<PreVendaCabecalho> listaPreVendaPendente() {
        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        Query q = em.createQuery("FROM PreVendaCabecalho p WHERE p.situacao = 'P' ORDER BY p.id");
        List<PreVendaCabecalho> listapreVendas = q.getResultList();
        em.close();
        return listapreVendas;
    }

    public List<PreVendaDetalhe> listaPreVendaDetalhePendente(Integer IdPreVendaCabecalho) {
        EntityManager em = JPAUtil.retornarFabrica().createEntityManager();
        Query q = em.createQuery("FROM PreVendaDetalhe p WHERE p.id = ?");
        q.setParameter(1, IdPreVendaCabecalho);
        List<PreVendaDetalhe> listapreVendas = q.getResultList();
        em.close();
        return listapreVendas;
    }

    public PreVendaCabecalho retornPreVendaPorId(Integer idPrevenda) {
        return JPAUtil.buscarPorId(PreVendaCabecalho.class, idPrevenda);
    }

    public void transferePreVendaParaCaixa(Integer valor) {
        PreVendaController p = new PreVendaController();
        PreVendaCabecalho preVenda = p.retornPreVendaPorId(valor);

        JPAUtil.mergeObjetoCaixa(Caixa.configuracao.getIdEcfCaixa().getIp(), preVenda);
    }
}
